package com.timanetworks.mailbox.common.http;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * Created by wusk on 2018/3/21.
 * OpenStack连接
 */
public class OpenStackHttpConnection {

    private static final Logger logger = LoggerFactory.getLogger(OpenStackHttpConnection.class);

//    private HttpConnectionService connection;
//
//    public OpenStackHttpConnection(HttpConnectionService http){
//        connection = http;
//    }
//
//    public Optional<HttpResponse> get(String host, int port, String uri, String token, List<NameValuePair> parameters, Header... headers){
//        try{
//            if(null != parameters && !parameters.isEmpty()){
//                String params = EntityUtils.toString(new UrlEncodedFormEntity(parameters), "UTF-8");
//                uri = uri + "?" + params;
//            }
//            return Optional.of(connection.get(host, port, uri, combineHeaders(token, headers)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    public Optional<HttpResponse> post(String host, int port, String uri, String token, String message, Header... headers){
//        try{
//            return Optional.of(connection.post(host, port, uri, message, combineHeaders(token, headers)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    public Optional<HttpResponse> put(String host, int port, String uri, String token, String message, Header... headers){
//        try{
//            return Optional.of(connection.put(host, port, uri, message, combineHeaders(token, headers)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    /**
//     * put请求，可以设置多个header
//    * @Description:
//    * @Title: put
//    * @param host
//    * @param port
//    * @param uri
//    * @param headerMap
//    * @return
//     */
//    public Optional<HttpResponse> put(String host, int port, String uri, Map<String, String> headerMap, File file){
//        try{
//            String url = baseUrl(host, port) + uri;
//            return Optional.of(connection.put(host, port, uri, file, this.setMoreHeader(headerMap)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    public Optional<HttpResponse> patch(String host, int port, String uri, String token, String message, Header... headers){
//        try{
//            return Optional.of(connection.post(host, port, uri, message, combineHeaders(token, headers)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    /**
//     *
//    * @Description: patch请求，可以设置多个header
//    * @Title: patch
//    * @param host
//    * @param port
//    * @param uri
//    * @param headerMap
//    * @param message
//    * @return
//     */
//    public Optional<HttpResponse> patch(String host, int port, String uri, Map<String, String> headerMap, String message){
//
//        try{
//            return Optional.of(connection.patch(host, port, uri, message, this.setMoreHeader(headerMap)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    public Optional<HttpResponse> delete(String host, int port, String uri, String token, Header... headers){
//        try{
//            return Optional.of(connection.delete(host, port, uri, combineHeaders(token, headers)));
//        } catch (Exception e) {
//            logger.error("", e);
//            return Optional.empty();
//        }
//    }
//
//    public String baseUrl(String host, int port){
//        return "http://" + host + ":" + port;
//    }
//
//    public Header tokenHeader(String token){
//        return new BasicHeader("token", token);
//    }
//
//    public Header[] setMoreHeader(Map<String, String> headerMap) {
//        if (null == headerMap || headerMap.isEmpty()) {
//            return null;
//        }
//
//        Header[] headers = new Header[headerMap.size()];
//        Header header = null;
//
//        int i = 0;
//        for (Map.Entry<String, String> oneHeader : headerMap.entrySet()) {
//            header = new BasicHeader(oneHeader.getKey(),oneHeader.getValue());
//            headers[i] = header;
//            i++;
//        }
//        return headers;
//    }
//
//    public String readFromResponse(HttpResponse response){
//        return connection.readBodyFromResponse(response);
//    }
//
//    /**
//     * 组装header。如果请求带有自定义header，需要将token添加到自定义header里面
//     * @param token token
//     * @param headers 自定义请求头
//     * @return 完整的请求头列表
//     */
//    private Header[] combineHeaders(String token, Header... headers){
//        if(null == headers || headers.length == 0){
//            return new Header[]{new BasicHeader("X-Auth-Token", token)};
//        }else {
//            int len = headers.length;
//            Header[] list = new Header[len + 1];
//            Header th = new BasicHeader("X-Auth-Token", token);
//            System.arraycopy(headers, 0, list, 0, len);
//            list[len] = tokenHeader(token);
//            return list;
//        }
//    }

    public String readFromResponse(HttpResponse response){
        HttpEntity result = response.getEntity();
        try {
            return EntityUtils.toString(result, "UTF-8");
        }catch (IOException e) {
            logger.error("", e);
            return null;
        }
    }
}
